S.O.L.I.D 設計原則(一) 內聚力&耦合力


Posted by JoJo on 2023-05-18

了解設計原則主要可以帶來兩個好處

可以寫出比較好的程式碼
能夠判斷程式碼的好壞

SOLID 簡介

SOLID設計原則的好處

  • 降低程式碼複雜程度
  • 增加程式碼的可讀性
  • 提升模組的可重複利用性
  • 讓模組具有相對高內聚力、低耦合力
  • 面臨變更需求時可減少破壞現有模組的風險

SOLID 五大原則:

  • 單一責任原則 SRP - Single Responsibility Principle
  • 開放封閉原則 OCP - Open Closed Principle
  • 里氏替換原則 LSP - Liskov Substitution Principle
  • 介面隔離原則 ISP - Interface Segregation Principle
  • 相依反轉原則 DIP - Dependency Inversion Principle

在談 SOLID 五大原則之前,先來談談「內聚力 Cohesion」跟「耦合力 Coupling」,首先我們先定義接下來討論的內聚力跟耦合力都是針對「模組 Module」來討論。

何謂模組 Module?

  • 可能是一個 Class
  • 可能是一個 Method
  • 可能是一個 Assembly

內聚力 Cohesion

在一個「模組內」完成「一件工作」的一種度量指標
要盡量設計「高內聚力」的程式碼

高內聚力

在一個「模組 Module」內只完成一項工作
內聚力高,代表該模組可以獨立運作的能力高,也就代表更容易重複利用

ex.一個 method 只負責一件事情像是寄email、驗證傳入的值是否有效

低內聚力

在一個「模組 Module」內完成多項工作
內聚力低,代表該模組做太多工作,會造成難以維護、測試、重用、理解

ex.所有功能寫在一個 class 裡或是一個 method 有 5000 行程式碼

內聚力最佳實務

實現「SRP」就是實現「提高內聚力」的一種表現

設計模組的時候要盡量設計「高內聚力」的程式碼
若要在一個模組內完成多項工作,建議拆成數個不同的類別

耦合力 Coupling

模組與模組之間的關聯強度
模組之間相互依賴的程度
在 Class B裡面直接建立了 Class A的物件實體就會建立 Class A 和 Class B 的耦合關係
要盡量設計「低耦合力」的程式碼

高耦合力

以上面的例子來說,高耦合力代表改了 Class A 的時候,相關聯的 Class B 就容易受影響 (改A壞B)

低耦合力

修改模組的時候,有越少的模組被影響就代表其耦合力越低

耦合力最佳實務

實現「DIP」就是實現「降低耦合力」的一種表現

設計模組的時候要盡量設計「低耦合力」的程式碼

總結

最理想狀況下應該要設計出「高內聚力」&「低耦合力」的程式碼,但這兩件事情其實是互斥的,怎麼說呢?

高內聚力,意味者我一次只做一件事情,但現實中系統是很複雜的,這時候就會建立很多 Class ,而 Class 多就意味者耦合力高,因為你需要呼叫各種不同的 Class ,彼此之間的耦合就變高了。

低耦合力,意味者我不跟其他模組有關聯,這在複雜的系統中就代表著你一隻 Class 做所有事情,這時候內聚力就低了。

所以在實務中,我們需要一些原則來達成內聚力和耦合力的平衡,而接下來要討論的 SOLID 設計原則就是為了解決這件事情。


#SOLID #CleanCode #CleanArchitecture #C#







Related Posts

React-[表單篇]-表單開發|手工版本

React-[表單篇]-表單開發|手工版本

滲透測試基本技術 第二章(前篇)

滲透測試基本技術 第二章(前篇)

滲透測試重新打底(6)--Metasploit與Port Forwarding簡介

滲透測試重新打底(6)--Metasploit與Port Forwarding簡介


Comments